home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
SDEMO.ZIP
/
SDEMO.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1995-05-28
|
12KB
|
379 lines
{16.III.1995}
{A very very small demo by Andrzej Dzirba}
{A critics and other comments please send to
DZIRBA@.VETTER.ZSE.LUBLIN.PL }
PROGRAM sdemo;
TYPE tbl = ARRAY [1..316] OF
INTEGER;
CONST vga = $A000;
TYPE
ball = ARRAY [1..20 * 20] OF
BYTE;
VAR
i : WORD;
x1, y1, t, omega, fi : REAL;
tblx : ^tbl;
tbly : ^tbl;
tblx2, tbly2 : ^tbl;
tblx3, tbly3 : ^tbl;
TYPE Virtual = ARRAY [1..64000] OF
BYTE;
VirtPtr = ^Virtual;
VAR Virscr : VirtPtr;
Vaddr : WORD;
virscr2 : VirtPtr;
vaddr2 : WORD;
CONST
k : ARRAY [1..3] OF
ball =
( (
0, 0, 0, 0, 0, 75, 77, 77, 77, 77, 76, 75, 71, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 77, 88, 86, 88, 88, 88, 88, 86, 83, 79, 75, 69, 0, 0, 0, 0, 0,
0, 0, 82, 89, 93, 93, 93, 93, 93, 92, 90, 88, 83, 80, 76, 71, 0, 0, 0,
0, 0, 79, 91, 96, 98, 98, 98, 98, 98, 96, 93, 92, 88, 83, 80, 76, 69, 0,
0, 0, 0, 93, 98, 101, 102, 102, 103, 103, 103, 101, 98, 93, 92, 88, 83, 79, 74,
0, 0, 0, 81, 98, 103, 104, 106, 108, 108, 108, 106, 103, 103, 98, 93, 90, 86, 81,
76, 69, 0, 0, 86, 101, 103, 108, 111, 112, 112, 112, 111, 108, 103, 101, 96, 92, 88,
83, 78, 73, 0, 0, 98, 103, 106, 111, 114, 117, 117, 117, 114, 111, 106, 102, 98, 93,
88, 83, 78, 71, 0, 0, 83, 103, 107, 112, 117, 120, 122, 120, 117, 112, 108, 102, 98,
93, 88, 83, 77, 69, 0, 0, 0, 103, 108, 112, 117, 122, 122, 120, 117, 113, 108, 102,
98, 93, 88, 83, 76, 0, 0, 0, 0, 86, 103, 112, 117, 120, 122, 120, 117, 113, 108,
103, 98, 93, 88, 83, 72, 0, 0, 0, 0, 0, 92, 106, 114, 117, 117, 117, 114, 111,
106, 103, 98, 93, 85, 77, 0, 0, 0, 0, 0, 0, 0, 89, 101, 107, 112, 112, 111,
108, 104, 101, 93, 86, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 94, 94,
92, 91, 88, 87, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 238, 238, 239, 240, 242,
244, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 233, 230, 227, 227, 229, 232,
234, 238, 241, 245, 250, 0, 0, 0, 0, 0, 0, 0, 233, 223, 223, 223, 223, 223, 226,
40, 232, 234, 238, 241, 246, 249, 0, 0, 0, 0, 0, 234, 222, 219, 219, 219, 219, 220,
223, 225, 40, 232, 234, 239, 242, 247, 251, 0, 0, 0, 0, 223, 215, 214, 215, 214, 214,
216, 218, 223, 225, 40, 232, 235, 239, 244, 248, 0, 0, 0, 232, 214, 211, 209, 209, 209,
211, 214, 214, 218, 223, 226, 229, 234, 238, 242, 247, 251, 0, 0, 226, 209, 207, 205, 205,
205, 207, 209, 43, 216, 220, 224, 228, 232, 237, 241, 245, 250, 0, 0, 224, 207, 203, 201,
201, 45, 203, 207, 211, 215, 219, 223, 227, 232, 237, 241, 245, 250, 0, 0, 40, 205, 201,
198, 46, 198, 45, 205, 209, 214, 219, 223, 227, 232, 237, 241, 247, 251, 0, 0, 0, 205,
201, 46, 196, 46, 201, 205, 209, 214, 219, 223, 227, 232, 237, 241, 247, 0, 0, 0, 0,
226, 201, 198, 196, 198, 201, 205, 209, 214, 219, 223, 227, 232, 236, 242, 247, 0, 0, 0,
0, 0, 219, 201, 201, 201, 203, 207, 211, 215, 219, 223, 227, 232, 238, 244, 0, 0, 0,
0, 0, 0, 0, 226, 205, 205, 207, 210, 43, 216, 220, 224, 230, 236, 244, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 40, 224, 226, 40, 230, 233, 234, 239, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 140, 147, 141, 138, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 143, 153, 151, 153, 151, 147, 141, 136, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 32, 156, 159, 159, 159, 156, 153, 147, 142, 137, 0, 0, 0,
0, 0, 0, 0, 0, 0, 151, 34, 166, 166, 166, 164, 159, 156, 153, 148, 142, 136, 0,
0, 0, 0, 0, 0, 0, 32, 163, 170, 172, 172, 172, 170, 166, 159, 156, 151, 145, 139,
132, 0, 0, 0, 0, 0, 0, 153, 170, 175, 178, 37, 178, 175, 170, 164, 159, 153, 147,
140, 133, 0, 0, 0, 0, 0, 0, 33, 172, 178, 182, 183, 182, 178, 172, 166, 160, 153,
147, 140, 133, 0, 0, 0, 0, 0, 0, 32, 172, 37, 183, 185, 183, 37, 172, 166, 160,
153, 147, 140, 132, 0, 0, 0, 0, 0, 0, 0, 158, 172, 182, 185, 182, 178, 172, 165,
159, 153, 145, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 172, 37, 178, 175, 170,
164, 159, 151, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 172, 172, 170,
166, 158, 151, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150,
153, 151, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) );
PROCEDURE setvga;
assembler;
asm
mov ax, 0013h
INT 10h
END;
PROCEDURE settext;
assembler;
asm
mov ax, 0003h
INT 10h
END;
FUNCTION KEYPRESSED : BOOLEAN;
assembler;
asm
IN al, 60h
cmp al, 1
je @EXIT
XOR al, al
@EXIT :
END;
PROCEDURE Pal (Col, R, G, B : BYTE);
assembler;
asm
mov dx, 3c8h
mov al, [Col]
out dx, al
INC dx
mov al, [R]
out dx, al
mov al, [G]
out dx, al
mov al, [B]
out dx, al
END;
PROCEDURE LoadPal (FileName : STRING);
TYPE DACType = ARRAY [0..255] OF
RECORD
R, G, B : BYTE;
END;
VAR DAC : DACType;
Fil : FILE OF
DACType;
i : INTEGER;
BEGIN
ASSIGN (Fil, FileName);
RESET (Fil);
READ (Fil, DAC);
CLOSE (Fil);
FOR i := 0 TO 255 DO
Pal (i, DAC [i] .R, DAC [i] .G, DAC [i] .B);
END;
PROCEDURE Cls (Col : BYTE;
Where : WORD);
assembler;
asm
push es
mov cx, 32000;
mov es, [Where]
XOR di, di
mov al, [Col]
mov ah, al
rep stosw
pop es
END;
PROCEDURE WaitRetrace;
assembler;
LABEL
l1, l2;
asm
mov dx, 3DAh
l1 :
IN al, dx
AND al, 08h
jnz l1
l2 :
IN al, dx
AND al, 08h
jz l2
END;
PROCEDURE putball (X, Y : WORD;
VAR sprt : ball;
Where : WORD);
assembler;
LABEL
_Redraw, _DrawLoop, _Exit, _LineLoop, _NextLine, _Store, _NoPaint;
asm
push ds
push es
lds si, sprt
mov ax, X { ax = x }
mov bx, Y { bx = y }
_Redraw :
push ax
mov ax, [Where]
mov es, ax
mov ax, bx {; ax = bx x = y}
mov bh, bl {; y = y * 256 bx = bx * 256}
XOR bl, bl
SHL ax, 6 {; y = y * 64 ax = ax * 64}
add bx, ax {; y = (y*256) + (Y*64) bx = bx + ax (ie y*320)}
pop ax {; get back our x}
add ax, bx {; finalise location}
mov di, ax
mov dl, 20 { dl = height of sprite }
XOR ch, ch
mov cl, 20 { cx = width of sprite }
cld
push ax
mov ax, cx
_DrawLoop :
push di { store y adr. for later }
mov cx, ax { store width }
_LineLoop :
mov bl, BYTE PTR [si]
OR bl, bl
jnz _Store
_NoPaint :
INC si
INC di
loop _LineLoop
jmp _NextLine
_Store :
movsb
loop _LineLoop
_NextLine :
pop di
DEC dl
jz _Exit
add di, 320 { di = next line of sprite }
jmp _DrawLoop
_Exit :
pop ax
pop es
pop ds
END;
PROCEDURE copyblock (X, Y : WORD;
height : WORD;
source, dest : WORD);
assembler;
asm
push ds
mov ax, dest
mov es, ax
mov ax, source
mov ds, ax
mov bx, [X]
mov dx, [Y]
push bx {; and this again for later}
mov bx, dx {; bx = dx}
mov dh, dl {; dx = dx * 256}
XOR dl, dl
SHL bx, 6 {; bx = bx * 64}
add dx, bx {; dx = dx + bx (ie y*320)}
pop bx {; get back our x}
add bx, dx {; finalise location}
mov di, bx {; es:di = where to go}
mov si, di
mov al, 60
mov bx, height { Hight of block to copy }
@@1 :
mov cx, 24 { Width of block to copy divided by 2 }
rep movsw
add di, 110h { 320 - 48 = 272 .. or 110 in hex }
add si, 110h
DEC bx
jnz @@1
pop ds
END;
PROCEDURE SetUpVirtual;
BEGIN
GETMEM (Virscr, 64000);
Vaddr := SEG (Virscr^);
GETMEM (virscr2, 64000);
vaddr2 := SEG (virscr2^);
END;
PROCEDURE ShutDown;
BEGIN
FREEMEM (Virscr, 64000);
FREEMEM (virscr2, 64000);
END;
PROCEDURE init;
BEGIN
t := 11;
omega := 10 / 20;
fi := PI / 20;
GETMEM (tblx, SIZEOF (tblx^) );
GETMEM (tbly, SIZEOF (tbly^) );
GETMEM (tblx2, SIZEOF (tblx2^) );
GETMEM (tbly2, SIZEOF (tbly2^) );
GETMEM (tblx3, SIZEOF (tblx3^) );
GETMEM (tbly3, SIZEOF (tbly3^) );
FOR i := 1 TO 316 DO
BEGIN
x1 := SIN (t);
y1 := SIN (omega * t + fi);
t := t + 0.04;
tblx^ [i] := ROUND (160 + x1 * (440 DIV 4) );
tbly^ [i] := ROUND (95 + y1 * (300 DIV 4) );
END;
t := 10.5;
FOR i := 1 TO 316 DO
BEGIN
x1 := SIN (t);
y1 := SIN (omega * t + fi);
t := t + 0.04;
tblx2^ [i] := ROUND (160 + x1 * (440 DIV 4) );
tbly2^ [i] := ROUND (95 + y1 * (300 DIV 4) );
END;
t := 10;
FOR i := 1 TO 316 DO
BEGIN
x1 := SIN (t);
y1 := SIN (omega * t + fi);
t := t + 0.04;
tblx3^ [i] := ROUND (160 + x1 * (440 DIV 4) );
tbly3^ [i] := ROUND (95 + y1 * (300 DIV 4) );
END;
END;
PROCEDURE liczenie;
BEGIN
i := 1;
REPEAT
copyblock (tblx^ [i] - 5, tbly^ [i] - 2, 25, vaddr2, Vaddr);
copyblock (tblx2^ [i] - 5, tbly2^ [i] - 2, 25, vaddr2, Vaddr);
copyblock (tblx3^ [i] - 5, tbly3^ [i] - 2, 25, vaddr2, Vaddr);
putball (tblx^ [i] + 5, tbly^ [i], k [1], Vaddr);
putball (tblx2^ [i] + 5, tbly2^ [i], k [2], Vaddr);
putball (tblx3^ [i] + 5, tbly3^ [i], k [3], Vaddr);
WaitRetrace;
copyblock (tblx^ [i] - 5, tbly^ [i] - 2, 25, Vaddr, vga);
copyblock (tblx2^ [i] - 5, tbly2^ [i] - 2, 25, Vaddr, vga);
copyblock (tblx3^ [i] - 5, tbly3^ [i] - 2, 25, Vaddr, vga);
INC (i);
IF i = 316 THEN
i := 1;
UNTIL KEYPRESSED;
FREEMEM (tblx, SIZEOF (tblx^) );
FREEMEM (tbly, SIZEOF (tbly^) );
FREEMEM (tblx2, SIZEOF (tblx2^) );
FREEMEM (tbly2, SIZEOF (tbly2^) );
FREEMEM (tblx3, SIZEOF (tblx3^) );
FREEMEM (tbly3, SIZEOF (tbly3^) );
END;
BEGIN
setvga;
SetUpVirtual;
Cls (0, vga);
Cls (0, Vaddr);
Cls (0, vaddr2);
LoadPal ('sdemo.pal');
init;
liczenie;
settext;
ShutDown;
WRITELN ('Very Small Demo by Andrzej Dzirba ');
WRITELN ('Dzirba@Vetter.Zse.Lublin.Pl');
END.